/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.uff.javaavancado.controller;

import br.uff.javaavancado.controletransacao.FabricaDeAppService;
import br.uff.javaavancado.exception.AplicacaoException;
import br.uff.javaavancado.modelos.Categoria;
import br.uff.javaavancado.modelos.Produto;
import br.uff.javaavancado.service.CategoriaService;
import br.uff.javaavancado.service.ProdutoService;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

/**
 *
 * @author Heliokann
 */
public class ProdutoController extends BaseController implements java.io.Serializable {

    private static final long serialVersionUID = 1L;
    private CategoriaService categoriaService;
    private ProdutoService produtoService;
    private DataModel tabelaProdutos;
    private List<SelectItem> comboCategorias;
    private String categoriaSelecionada;
    private Produto produtoCorrente;

    public ProdutoController() {
        try {
            produtoService = FabricaDeAppService.getAppService(ProdutoService.class);
        } catch (Exception ex) {
            Logger.getLogger(ProdutoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            categoriaService = FabricaDeAppService.getAppService(CategoriaService.class);
        } catch (Exception ex) {
            Logger.getLogger(ProdutoController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String novoProduto() {
        produtoCorrente = new Produto();
        return "editarProduto";
    }

    public String visualizarProduto() {
        produtoCorrente = (Produto) tabelaProdutos.getRowData();
        categoriaSelecionada = produtoCorrente.getCategoria().toString();
        return "editarProduto";
    }

    public String salvarProduto() {
        Categoria categoria = (Categoria) getObjetoSelecionado(comboCategorias, categoriaSelecionada);
        produtoCorrente.setCategoria(categoria);
        if (produtoCorrente.getId() == null) {
            produtoService.salvar(produtoCorrente);
        } else {
            produtoService.atualizar(produtoCorrente);
        }
        categoriaSelecionada = null;
        
        return "controleProduto";
    }

    public String deletarProduto() {
        produtoCorrente = (Produto) tabelaProdutos.getRowData();
        try {
            produtoService.excluir(produtoCorrente);
        } catch (AplicacaoException e) {
            this.error(getMensagemBundled("erroDeletarProduto"));
        }
        return null;
    }

    public String atualizaProdutosCategoria() {
        Categoria c = (Categoria) getObjetoSelecionado(comboCategorias, categoriaSelecionada);
        List<Produto> lista;
        if (c == null) {
            lista = produtoService.getListaCompleta();
        } else {
            lista = produtoService.getListaOrdenada(c);
        }
        if (lista != null) {
            tabelaProdutos = new ListDataModel(lista);
        } else {
            tabelaProdutos = null;
        }
        categoriaSelecionada = null;
        
        return null;
    }

    public List<SelectItem> getComboCategorias() {
        final List<Categoria> lista = categoriaService.getListaCompleta();
        if (lista != null) {
            comboCategorias = new ArrayList<SelectItem>(lista.size() + 1);
            comboCategorias.add(new SelectItem(null, "Escolha uma categoria"));
            for (Categoria c : lista) {
                comboCategorias.add(new SelectItem(c, c.toString()));
            }
        }
        return comboCategorias;
    }

    public Object getObjetoSelecionado(List<SelectItem> lista, String selecao) {
        for (SelectItem sel : lista) {
            if (sel.getLabel().equals(selecao)) {
                return sel.getValue();
            }
        }
        return null;
    }
    
    public String cancelar() {
        categoriaSelecionada = null;
        return "controleProduto";
    }
    
    public DataModel getTabelaProdutos() {
        List produtos = produtoService.getListaCompleta();
        tabelaProdutos = new ListDataModel(produtos);
        return tabelaProdutos;
    }

    public void setTabelaProdutos(DataModel tabelaProdutos) {
        this.tabelaProdutos = tabelaProdutos;
    }

    public String getCategoriaSelecionada() {
        return categoriaSelecionada;
    }

    public void setCategoriaSelecionada(String categoriaSelecionada) {
        this.categoriaSelecionada = categoriaSelecionada;
    }

    public Produto getProdutoCorrente() {
        return produtoCorrente;
    }

    public void setProdutoCorrente(Produto produtoCorrente) {
        this.produtoCorrente = produtoCorrente;
    }

    public void setComboCategorias(List<SelectItem> comboCategorias) {
        this.comboCategorias = comboCategorias;
    }

}
